Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

14.02.2018, 03:26

[Python] Imports im ZIP-Package

Hi,
aktuell arbeite ich, privat, an einer kleinen Blog-engine in Python 3.5 mit den Libraries 'asyncio' und 'aiohttp'.
Bisher sehen meine Imports immer so aus wie im folgenden Beispiel.

C-/C++-Quelltext

1
from luther.helper import requires_authentication


Meine Projektstruktur sieht etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
\luther (<- git root)
    __main__.py
    luther\
        __init__.py
        \helper
            __init__.py
            authentication.py


Wenn ich jetzt im Terminal 'python3 .' eingebe, führt er automatisch '__main__.py' aus.
So kann ich direkt auch auf alle Submodule (z.B. 'luther.helper') zugreifen.
Wenn ich aber versuche mein Projekt als .ZIP-Datei zu bundeln, dann beschwert sich der Interpreter plötzlich,
dass er die Imports nicht findet oder, dass er den 'Namen' 'require_authentication' nicht laden kann.
Allgemein sind die Fehlermeldung sehr nichts-sagend.

Ich habe bereits versucht, das .ZIP-Bundle als Modul dynamisch zur Laufzeit im PYTHONPATH einzubinden ohne jeglichen erfolg.
Genutzt habe ich dafür Folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
# Code ad-hoc aus dem Kopf geschrieben...
import os.path
import sys

bundle_path = os.path.directory(os.path.realpath(__file__))
sys.path.append(bundle_path)


Alternative habe ich auch relative-imports genutzt, welche nun aber auch nicht funktionieren.

TL;DR / Frage
Hat jemand schon erfolgreich ein Programm, welches in Python geschrieben wurde, als ausführbare .ZIP-Datei gebündelt?
Wenn ja, gibt es Besonderheiten die man beim Import-System beachten muss?

LG Julien
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Julién« (14.02.2018, 03:38) aus folgendem Grund: Quote-Block durch Code-Block ersetzt, da Quote anscheinend Einrückungen erfolgreich ignoriert. Doppelte Verwendung von 'erfolgreich' im Satz, welcher auf TL;DR folgt.


Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

2

14.02.2018, 03:54

--- Update ---
Folgende Struktur scheint zu funktionieren:

C-/C++-Quelltext

1
2
3
    luther\ (git root)
        __main__.py
        test.py


mit __main__.py:

C-/C++-Quelltext

1
2
3
4
5
6
import test

def main():
    test.test()

main()


und test.py

C-/C++-Quelltext

1
2
def test():
    print('THIS IS SPARTA!')


Die scheint zu funktionieren. Leider kann ich keine Module aus Subdirectories einbinden.
Weiß jemand woran das liegen könnte?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

3

14.02.2018, 04:21

--- Update Lösung ---
In einigen Tutorials wurde ganz lapidar das Terminaltool zip verwendet um solche Bündel zu erstellen.
Auf der anderen Seite wird unter anderem das Module 'zipapp' (im Terminal python3 -m zipapp <source_dir>) bereitgestellt.

Ich habe mal beide Optionen probiert und anscheinend macht das Modul zipapp noch mehr, als anfangs vermutet.
Die Datei, welche von zipapp erstellt wurde enthält, laut diff, noch einige extra Zeilen.

Was diese bewirken? Keinen blassen Schimmer!
Funktioniert es? Ja!
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

14.02.2018, 06:24

Du kannst die Pakete auch mit PIP lokal installieren. Dann tut's auch von allein. Jedenfalls musst du dann keine händischen Hacks machen und nutzt gleich auch noch einen sauberen Paket-Manager.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

5

14.02.2018, 15:54

Mit 'zipapp' ist es kein Hack mehr.
Wenn alles weiterhin läuft wie geplant, dann habe ich ein Programm, ähnlich wie 'supervisord', dass ich mit einem Doppelklick aufrufen kann.

Eine Python3 installation ist dabei dennoch eine Voraussetzung.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Werbeanzeige